let haspathsum = function (root, targetsum) {
  // 递归法
  // const traversal = (node, cnt) => {
  //   // 遇到叶子节点，并且计数为0
  //   if (cnt === 0 && !node.left && !node.right) return true;
  //   // 遇到叶子节点而没有找到合适的边(计数不为0)，直接返回
  //   if (!node.left && !node.right) return false;
  //
  //   //  左（空节点不遍历）.遇到叶子节点返回true，则直接返回true
  //   if (node.left && traversal(node.left, cnt - node.left.val)) return true;
  //   //  右（空节点不遍历）
  //   if (node.right && traversal(node.right, cnt - node.right.val)) return true;
  //   return false;
  // };
  // if (!root) return false;
  // return traversal(root, targetsum - root.val);

  // 精简代码:
  if (!root) return false;  // 如果根节点为空，返回false
  //  targetsum === root.val 表示找到了合适的边
  if (!root.left && !root.right   // 如果左右节点都为空，则直接返回true
      && targetsum === root.val)  // 如果根节点为叶子节点，并且计数为0，返回true
    return true;// 叶子节点
  return haspathsum(root.left, targetsum - root.val) ||   // ||的作用是：如果左右子树都没有找到，则返回false
        haspathsum(root.right, targetsum - root.val);   // 右子树   
};
let root = {
  val: 5,
  left: {
    val: 4,
    left: {
      val: 11,
      left: {     
        val: 7,
        left: null,
        right: null,
      },
      right: {
        val: 2,
        left: null,
        right: null,
      },
    },
    right: {
      val: 8,
      left: null,
      right: null,
    },
  },
  right: {
    val: 8,
    left: {
      val: 13,
      left: null,
      right: null,
    },
    right: {
      val: 4,
      left: null,
      right: null,
    },
  },
};

console.log(haspathsum(root, 22));

// if(!root) return false;
// if(!root.left && !root.right&&) return true